package com.zhike.service.file;

import java.util.HashMap;
import java.util.Set;
import javax.servlet.http.HttpServlet;
import lombok.extern.slf4j.Slf4j;

/**
 * 一个可重用的文件上传根类（不支持断点续传）。
 * <p>
 * 目前只提供同时上传一个文件的能力。本类建议用于较小文件的上传，原因是它不支持断点续传嘛。
 * <p>
 * <b>补充：</b>上传文件时，Android、Web其实是可以通过在上传URL中将参数带过来，但对于iOS
 * 端的 AFNetworking 3.0库来说这样做会直接导致客户端卡死（可能是AFN的bug，也可能是ios
 * 的bug） ，所以目前RainbowChat服务端的文件上传处理类中，是从Multipart Content中读
 * 取参数（而不是url的参数），客户端也应该把参数放到Multipart Content中传过来，而不是url中。
 * 
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @version 1.0
 * @since 4.0
 */
@Slf4j
public abstract class UploaderRoot extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * 上传的文件要保存的目录（此目录末尾要带“/”哦）。
	 * 
	 * @return
	 */
	public abstract String getFileSaveDir();

	/**
	 * 区分文件的目标标记
	 * 
	 * @return
	 */
	public abstract String getPathTag();

	/**
	 * 文件数据上传保存成功后要调用的方法。
	 * 
	 * @param parametersFromClient 客户端传上来的额外参数，回参数回调时可保证不为null
	 * @throws Exception 子类实现本方法时可能因客户端传上来的参数不合要求而抛出异常
	 */
	public abstract void onUploadSucess(HashMap<String, Object> parametersFromClient) throws Exception;

	/**
	 * 文将上传和上传完成后处理过程中的任何异常发生时将调用本方法。
	 * 
	 * @param ex
	 */
	public abstract void onUploadFailure(Exception ex);

	/**
	 * 返回一个字符串，用于Debug时作为TAG显示，从而方便区分其它继承自本类的子类log输出。
	 * 
	 * @return
	 */
	public abstract String getDebugTAG();

	/**
	 * 支持的文件类型
	 * @return
	 */
	public abstract Set<String> getDetectedTypes();
}
